<?php

namespace App\Miya\UIData;

use App\Miya\Models\Classify;
use App\Miya\Models\Info;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class ClassifyData extends CommonData
{
    protected $name = 'classify';
    protected $fields = ['id', 'module_id', 'name', 'avatar', 'tag', '_lft', '_rgt', 'parent_id', 'content'];
    protected $infoFields = [
        'id', 'module_id', 'classify_id', 'name', 'keyword_id', 'avatar',
        'content', 'tag', 'images', 'is_delayed', 'delayed_at',
        'custom_keywords', 'page_views', 'extends', 'created_at'
    ];

    /**
     * 通过分类id得到分类信息
     * @param $id 分类id
     *
     * @operate 直接调用
     *
     * @data id 分类id
     * @data module 所属模块信息 id:模块id name:模块名称 tag:模块Tag
     * @data name 分类名称
     * @data avatar 分类封面图
     * @data tag 分类tag
     * @data content 分类说明内容
     * @data url() 分类超链接
     */
    public function get($id): Classify
    {
        return $this->dataCache(function () use ($id) {
            $classify = Classify::select($this->fields)->with(['module:id,name,tag'])->find($id);
            if (!$classify) {
                $msg = sprintf('分类中未找到id为 %s 的数据信息', $id);
                throw new ModelNotFoundException($msg);
            }

            $classify->avatar && $classify->avatar = asset('uploads/' . $classify->avatar);

            return $classify;
        }, __METHOD__, $id);
    }

    /**
     * 通过分类id得到分类信息
     * @param $id 分类id
     *
     * @operate 直接调用
     *
     * @data id 分类id
     * @data module 所属模块信息 id:模块id name:模块名称 tag:模块Tag
     * @data name 分类名称
     * @data avatar 分类封面图
     * @data tag 分类tag
     * @data content 分类说明内容
     * @data url() 分类超链接
     */
    public function getByTag($tag): Classify
    {
        return $this->dataCache(function () use ($tag) {
            $classify = Classify::select($this->fields)
                ->with(['module:id,name,tag'])->whereTag($tag)->first();
            if (!$classify) {
                $msg = sprintf('分类中未找到tag为 %s 的数据信息', $tag);
                throw new ModelNotFoundException($msg);
            }

            $classify->avatar && $classify->avatar = asset('uploads/' . $classify->avatar);

            return $classify;
        }, __METHOD__, $tag);
    }

    /**
     * 使用分类id获取分类下信息
     * @param $classifyId 分类id
     *
     * @operate 遍历后调用
     *
     * @data id 信息id
     * @data module 对应模块信息 id:模块id tag:模块标签 name:模块名称
     * @data classify 对应分类信息 id:分类id tag:分类标签 name:分类名称
     * @data name 信息名称
     * @data keyword 分类关键词信息 id:关键词id keyword:关键词
     * @data avatar 信息封面度
     * @data content 信息内容
     * @data tag 信息标签
     * @data images 信息图片列表
     * @data custom_keywords 信息自定义关键词
     * @data extends 拓展信息列表
     * @data page_views 访问量
     * @data type_list 属性信息列表
     * @data time 信息时间
     * @data url() 信息超链接
     * @data sketch() 信息内容的部分简略信息 默认100
     * @data parseTime('Y-m-d H:i:s') 格式化信息时间
     */

    public function infos($classifyId): Collection
    {
        return $this->dataCache(function () use ($classifyId) {
            $classify = Classify::with(['module'])->find($classifyId);
            if (!$classify) {
                $msg = sprintf('分类中未找到id为 %s 的数据信息', $classifyId);
                throw new ModelNotFoundException($msg);
            }

            return $this->parseInfoData($classify);
        }, __METHOD__, $classifyId);
    }

    /**
     * 使用分类tag获取分类下信息
     * @param $classifyTag 分类tag
     *
     * @operate 遍历后调用
     *
     * @data id 信息id
     * @data module 对应模块信息 id:模块id tag:模块标签 name:模块名称
     * @data classify 对应分类信息 id:分类id tag:分类标签 name:分类名称
     * @data name 信息名称
     * @data keyword 分类关键词信息 id:关键词id keyword:关键词
     * @data avatar 信息封面度
     * @data content 信息内容
     * @data tag 信息标签
     * @data images 信息图片列表
     * @data custom_keywords 信息自定义关键词
     * @data extends 拓展信息列表
     * @data page_views 访问量
     * @data type_list 属性信息列表
     * @data time 信息时间
     * @data url() 信息超链接
     * @data sketch() 信息内容的部分简略信息 默认100
     * @data parseTime('Y-m-d H:i:s') 格式化信息时间
     */

    public function infosbyTag($classifyTag): Collection
    {
        return $this->dataCache(function () use ($classifyTag) {
            $classify = Classify::with(['module'])->whereTag($classifyTag)->first();
            if (!$classify) {
                $msg = sprintf('分类中未找到tag为 %s 的数据信息', $classifyTag);
                throw new ModelNotFoundException($msg);
            }

            return $this->parseInfoData($classify);
        }, __METHOD__, $classifyTag);
    }

    /**
     * 整理分类数据
     *
     * @param Classify $classify
     * @return Collection
     */
    protected function parseInfoData(Classify $classify): Collection
    {
        $builder = Info::select($this->infoFields)->whereHas('classify')
            ->with(Info::$DefaultRelationships)
            ->where('status', 1)
            ->where('classify_id', $classify->id)
            ->where(function ($query) {
                $query->where('is_delayed', 2)->orWhere(function ($query) {
                    $query->where('is_delayed', 1)->where('delayed_at', '<=', now());
                });
            });
        //信息排序
        $builder = Info::rankByType($builder, $classify->module->info_rank_type);
        $infos = $builder->get();

        $infos = $infos->map(function ($info) {
            $info->avatar && $info->avatar = asset('uploads/' . $info->avatar);
            $info->images = array_map(function ($img) {
                return asset('uploads/' . $img);
            }, $info->images);
            $info->keywords = $info->getKeywords();
            return $info;
        });

        return $infos;
    }
}
